# 导入工具包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 1、读入数据
df = pd.read_csv("E:/VC_project/data/FE_day.csv")
print(df.info())

# 2、数据准备
#从原始数据中分离特征X和输出y
X = df.drop(["cnt"],axis=1)
y = df["cnt"]
# 使用train_test_split将数据分成测试集和训练集
# 80%作为训练数据，20%作为测试数据
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=50,test_size=0.2)
print(X_train.shape)

# 3、模型训练

# 使用开方均方误差RMSE作为模型的评价指标
from sklearn.metrics import mean_squared_error


# 3.1 最小二乘模型
from sklearn.linear_model import LinearRegression

# 3.1.1 使用最小二乘训练模型及预测
# 实例化模型
lr = LinearRegression()
# 使用训练集训练模型参数
lr.fit(X_train,y_train)

# 用训练好的模型对训练集和测试集进行预测
y_train_pred_lr = lr.predict(X_train)
y_test_pred_lr = lr.predict(X_test)

# 3.1.2 最小二乘模型评估

# （1）RMSE（开方均方误差）
# 测试集
print("对测试集使用RMSE评价最小二乘模型的性能，其结果是：{:.2f}".format(mean_squared_error(y_test,y_test_pred_lr)))

# 训练集
print("对训练集使用RMSE评价最小二乘模型的性能，其结果是：{:.2f}".format(mean_squared_error(y_train,y_train_pred_lr)))

# （2）查看各特征权重系数，系数的绝对值大小可视为该特征的重要性
feat_names = X.columns
fs = pd.DataFrame({"cloumns":list(feat_names), "coef":list((lr.coef_.T))})
print(fs.sort_values(by=["coef"],ascending=False))

# 3.2 岭回归模型（超参数调优）
from sklearn.linear_model import RidgeCV

# 3.2.1 使用RidgeCV训练模型及预测

# 设置超参数（正则参数）范围
alphas = [0.1,0.3,0.5,0.7,0.9,1]
# 实例化模型
ridge = RidgeCV(alphas=alphas,store_cv_values=True)
# 使用训练集训练模型参数
ridge.fit(X_train,y_train)

# 用训练好的模型对训练集和测试集进行预测
y_train_pred_ridge = ridge.predict(X_train)
y_test_pred_ridge = ridge.predict(X_test)

# 3.2.2 岭回归模型评估

# （1）RMSE（开方均方误差）
# 测试集
print("对测试集使用RMSE评价RidgeCV模型的性能，其结果是：{:.2f}".format(mean_squared_error(y_test,y_test_pred_ridge)))
# 训练集
print("对训练集使用RMSE评价RidgeCV模型的性能，其结果是：{:.2f}".format(mean_squared_error(y_train,y_train_pred_ridge)))

# （2）查看各特征权重系数，系数的绝对值大小可视为该特征的重要性

fs = pd.DataFrame({"cloumns":list(feat_names), "coef":list((ridge.coef_.T))})
print(fs.sort_values(by=["coef"],ascending=False))
print("best alpha is:",ridge.alpha_)


# 3.3 Lasso模型（超参数调优）
from sklearn.linear_model import LassoCV

# 3.2.1 使用LassoCV训练模型及预测

# 设置超参数（正则参数）范围
alphas = [0.1,0.5,1,5,10]
# 实例化模型
lasso = LassoCV(alphas=alphas)
# 使用训练集训练模型参数
lasso.fit(X_train,y_train)

# 用训练好的模型对训练集和测试集进行预测
y_train_pred_lasso = lasso.predict(X_train)
y_test_pred_lasso = lasso.predict(X_test)

# 3.2.2 Lasso模型评估

# （1）RMSE（开方均方误差）
# 测试集
print("对测试集使用RMSE评价LassoCV模型的性能，其结果是：{:.2f}".format(mean_squared_error(y_test,y_test_pred_lasso)))
# 训练集
print("对训练集使用RMSE评价LassoCV模型的性能，其结果是：{:.2f}".format(mean_squared_error(y_train,y_train_pred_lasso)))

# （2）查看各特征权重系数，系数的绝对值大小可视为该特征的重要性

# 4.比较三种模型的各特征系数
fs = pd.DataFrame({"cloumns":list(feat_names), "coef_lr":list((lr.coef_.T)),"coef_ridge":list((ridge.coef_.T)),"coef_lasso":list((lasso.coef_.T))})
print(fs.sort_values(by=["coef_lr"],ascending=False))


